#include <bits/stdc++.h>
using namespace std;
const int MAX_SCORE = 100000 + 5;
int cnt[MAX_SCORE];             // 统计在某个分数的人数
int val[MAX_SCORE];             // 存储一个分组当中的人数 
int dp[MAX_SCORE];
int main()
{
#ifdef LOCAL
    freopen("PREV-50.in", "r", stdin);
#endif
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int N, K, score;
    cin >> N >> K;
    for(int i = 0; i < N; ++i)
        cin >> score, cnt[score]++;
    int ans = 0;
    // k = 0, 则分数相同分为一组, 组数即为答案
    if(K == 0) 
    {
        for(int i = 1; i < MAX_SCORE; ++i)
            if(cnt[i]) ans += 1;
    } 
    else 
    {
        // 分成k组
        for(int i = 1; i <= K; ++i) 
        {
            memset(val, 0, sizeof(val));
            memset(dp, 0, sizeof(dp));
            int x = 1;
            // 筛选出第i组的元素, 且开头元素为i;
            for(int j = i; j <= MAX_SCORE; j += K)
            {
                val[x++] = cnt[j];
            }

            // 求出该分组当中可以同时在线的人数
            // dp[j] = max(dp[j - 2] + val[j], dp[j - 1]);
            dp[0] = 0;
            for(int j = 1; j < x; ++j)
            {
                if(j == 1) dp[j] = val[1];
                else dp[j] = max(dp[j - 2] + val[j], dp[j - 1]);
            } 
            ans += dp[x-1];
        }
    }
    cout << ans << endl;
    return 0;
}